package com.ruixi.utils;

import lombok.Data;

/**
 * @author lrzg
 * @date 2021-10-18 16:36
 * @Description 返回结果集
 */
@Data
public class RT<T> {

    /*
     * 请求响应code，200表示请求成功，其他表示失败
     * */
    private int code = 200;
    /*
     * 响应客户端的提示消息
     * */
    private String msg;

    /*
     * 响应客户端内容
     * */
    private T data;

    /**
     * 响应结果
     */
    private boolean success;

    /*
     * 先编写 7个 构造函数，然后再编写静态函数，便于开发
     * */

    public RT() {
        this.code = Status.SUCCESS.code;
        this.msg = Status.SUCCESS.message;
        this.data = null;
        this.success = true;
    }

    public RT(T data) {
        this.code = Status.SUCCESS.code;
        this.msg = Status.SUCCESS.message;
        this.data = data;
        this.success = true;
    }

    public RT(int code, String msg, boolean success) {
        this.code = code;
        this.msg = msg;
        this.success = success;
    }

    public RT(int code, T data) {
        this.code = code;
        this.data = data;
    }

    public RT(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public RT(Status status) {
        this.code = status.code;
        this.msg = status.message;
        this.data = null;
    }

    public RT(Status status, T data) {
        this.code = status.code;
        this.msg = status.message;
        this.data = data;
    }

    // 以下 为定义的方法，直接调用上面封装好的 构造方法。  6个

    /**
     * 操作成功 data 不为null
     */
    public static <T> RT success(T data) {
        return new <T>RT(data);
    }

    /**
     * 操作成功 data为null
     */
    public static <T> RT success() {
        return new <T>RT();
    }

    /**
     * 自定义 返回操作 data 可控
     */
    public static <T> RT success(int code, String msg, T data) {
        return new <T>RT(code, msg, data);
    }

    /**
     * 自定义返回  data为null
     */
    public static <T> RT success(int code, String msg) {
        return new <T>RT(code, msg);
    }

    /**
     * 自定义返回 入参一般是异常code枚举 data为空
     */
    public static <T> RT success(Status status) {
        return new <T>RT(status);
    }

    /**
     * 自定义返回 入参一般是异常code枚举 data 可控
     */
    public static <T> RT success(Status status, T data) {
        return new <T>RT(status, data);
    }

    /**
     * 操作失败
     */
    public static <T> RT fail() {
        return new <T>RT(Status.ERROR.code,Status.ERROR.message,false);
    }

    public static <T> RT fail(int code, String msg) {
        return new <T>RT(code, msg, false);
    }
}
